package com.ziroom.crm.mq.core.processor.persistence;

import com.ziroom.crm.mq.core.context.InvokeContext;
import com.ziroom.crm.mq.core.data.ProcessTypes;
import com.ziroom.crm.mq.core.persistence.Persistence;
import com.ziroom.crm.mq.core.persistence.PersistenceManager;
import com.ziroom.crm.mq.core.processor.*;

import java.util.Objects;

/**
 * <p></p>
 * <p>
 * <PRE>
 * <BR>    修改记录
 * <BR>-----------------------------------------------
 * <BR>    修改日期         修改人          修改内容
 * </PRE>
 *
 * @author WeiShaoying
 * @version 1.0
 * @date Created in 2020年09月02日 10:21
 * @since 1.0
 */
@SuppressWarnings("ALL")
public class PersistenceProcessor implements SendProcessor, ReSendProcessor, ConsumeProcessor, ReConsumeProcessor {

    @Override
    public void postSend(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        if (Objects.nonNull(invokeContext.getMessage().getException())) {
            //存在异常 保存
            Persistence persistence = PersistenceManager.getPersistence(queueWrapper.getMqType());
            persistence.save(invokeContext.getMessage(), ProcessTypes.SEND);
            persistence.save(invokeContext.getMessage(), ProcessTypes.BACKUP_SEND);
        }
    }

    @Override
    public void preReSend(InvokeContext invokeContext, QueueWrapper queueWrapper) {

    }

    @Override
    public void postReSend(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        Persistence persistence = PersistenceManager.getPersistence(queueWrapper.getMqType());

        if (invokeContext.getMessage().isRetryFailed()) {
            // 重试失败，存储死信消息
            persistence.save(invokeContext.getMessage(), ProcessTypes.DEAD_SEND);
        } else if (Objects.nonNull(invokeContext.getMessage().getException())) {
            //存在异常 保存
            persistence.save(invokeContext.getMessage(), ProcessTypes.RESEND);
        } else if (Objects.isNull(invokeContext.getMessage().getException())) {
            // 没有异常，成功
            persistence.save(invokeContext.getMessage(), ProcessTypes.SUCCESS_SEND);
        }
    }

    @Override
    public void preSend(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        //
    }

    @Override
    public void preConsume(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        //
    }

    @Override
    public void postConsume(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        //存在异常 保存
        if (Objects.nonNull(invokeContext.getMessage().getException())) {
            Persistence persistence = PersistenceManager.getPersistence(queueWrapper.getMqType());
            persistence.save(invokeContext.getMessage(), ProcessTypes.CONSUME);
            persistence.save(invokeContext.getMessage(), ProcessTypes.BACKUP_CONSUME);
        }
    }

    @Override
    public void preReConsume(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        //
    }

    @Override
    public void postReConsume(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        Persistence persistence = PersistenceManager.getPersistence(queueWrapper.getMqType());
        if (invokeContext.getMessage().isRetryFailed()) {
            // 重试失败，存储死信消息
            persistence.save(invokeContext.getMessage(), ProcessTypes.DEAD_CONSUME);
        } else if (Objects.nonNull(invokeContext.getMessage().getException())) {
            // 存在异常 保存
            persistence.save(invokeContext.getMessage(), ProcessTypes.RE_CONSUME);
        } else if (Objects.isNull(invokeContext.getMessage().getException())) {
            // 没有异常，成功
            persistence.save(invokeContext.getMessage(), ProcessTypes.SUCCESS_CONSUME);
        }
    }

}
